/* 
 * Copyright (c) 2022  National University of Defense and Technology.
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the FreeBSD License.   
 */

/* Entry point for bare metal programs */
.section .text.start
.global _start
.global main
//.global irq
.global memset

.type _start, @function

_start:
/* initialize global pointer */
.option push
.option norelax
1:  auipc gp, %pcrel_hi(__global_pointer$)
    addi  gp, gp, %pcrel_lo(1b)
.option pop

/* initialize stack pointer */
    la sp, _sp

/* set vector table address and vectored mode */
    la a0, __vector_start
    ori a0, a0, 0x1
    csrw mtvec, a0

/* clear the bss segment */
    // la a0, __bss_start
    // la a2, __bss_end
    // sub a2, a2, a0
    // li a1, 0
    // call memset

/* new-style constructors and destructors */
    // la a0, __libc_fini_array
    // call atexit
    // call __libc_init_array

/* call main */
    lw a0, 0(sp)                    /* a0 = argc */
    addi a1, sp, __SIZEOF_POINTER__ /* a1 = argv */
    li a2, 0                        /* a2 = envp = NULL */
    call main
    // tail exit

// .size  _start, .-_start

// .global _init
// .type   _init, @function
// .global _fini
// .type   _fini, @function
// _init:
// _fini:
//  /* These don't have to do anything since we use init_array/fini_array. Prevent
//     missing symbol error */
//     ret
// .size  _init, .-_init
// .size _fini, .-_fini
